home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / keycodes.zip / KEYCODES.ASM next >
Assembly Source File  |  1989-04-16  |  15KB  |  501 lines

  1. PAGE ,132
  2. ;
  3. ;
  4. ;         Thomas Nofsinger
  5. ;         cccc ASM  290
  6. ;         4/16/89
  7. ;
  8. ;
  9. ;                  PROGRAM LISTING FOR KEYCODES.EXE
  10. ;
  11. ;      THIS PROGRAM WILL DISPLAY THE SCAN CODE AND THE ALPHANUMERIC
  12. ; VALUE OF ANY DEPRESSED KEYBOARD KEY.  IT WILL EXIT AFTER DOING THREE
  13. ; DISPLAY CYCLES.
  14. ;
  15. ;
  16. ;
  17.                                        ;PROCEDURES TO
  18.        EXTRN   NEWLINE:FAR         ;DISPLAY NEWLINE CHARACTER
  19.            EXTRN   PUTDEC:FAR          ;DISPLAY 16-BIT DECIMAL INTEGER
  20.        EXTRN   PUTSTRNG:FAR        ;DISPLAY CHARACTER STRING
  21.        EXTRN   CLEAR:FAR           ;CLEAR SCREEN
  22. ;
  23. ;
  24. ; MACRO DEFINITIONS
  25. INCLUDE PUSHPOP.MAC
  26. ;
  27. ;           
  28. ; S T A C K   S E G M E N T   D E F I N I T I O N
  29. ;
  30. STACK      SEGMENT STACK
  31.            DB      256 DUP(?)
  32. STACK      ENDS
  33. ;
  34. ; D A T A   S E G M E N T   D E F I N I T I O N
  35. ;
  36. DATA       SEGMENT
  37. ;
  38. ;  COPYRIGHT BOX
  39. LINE       db      '          __________________________________________________________  '
  40. SIDE       db      '         |                                                          | '
  41. CPY_RT     db      '         |  Copyright 1989 Thomas I. Nofsinger; All Rights Reserved | '
  42. B_LINE     db      '         |__________________________________________________________| '
  43. ;
  44. PROMPT1    DB      '      This program returns the scan code and the alphanumeric value of     '
  45. PROMPT2    DB      '      any depressed key.  This program will exit after displaying 15 codes.'
  46. PROMPT3    DB      '      Due to non-compatibility between PC keyboards, If the key you press  '
  47. PROMPT4    DB      '      is a non-printable character, look under your finger to see what key '
  48. PROMPT5    DB      '      you pressed.  For quick exit, hit the same key twice.  Program on:   '
  49. HEADING    DB      '   INS  CAP  NUM  SCR  ALT  CTRL  LSHFT  RSHFT  CHAR   CODE   NON-PRINTABLE'
  50. XXX        DB      'xxxx'      ;  for marking out colm's
  51. wipeout    DB      '                                                                              '
  52. SYMBOL     DB      '*'
  53. EVEN
  54. ASCII      DB   0 ;INIT TO ZERO
  55. FRAME_ROW  DB   0  ;INIT TO ZERO
  56.  
  57. ;
  58. EVEN               ;USE EVEN MEMORY ADDRESSES
  59. SCAN       DW   0  ;INIT TO ZERO
  60. SCAN1      DW   0  ;INIT TO ZERO
  61. FLAG       DW   0  ;INIT TO ZERO
  62. FLAG1      DW   1  ;INIT TO ONE
  63. TEMP       DW   0  ;INIT TO ZERO
  64. COUNT      DW  15  ;INIT TO 15
  65. DATA       ENDS
  66.  
  67.  
  68. ;
  69. ; C O D E   S E G M E N T   D E F I N I T I O N
  70. ;
  71. CODE       SEGMENT
  72.            ASSUME  CS:CODE,SS:STACK,ES:DATA 
  73. KEYCODES   PROC    FAR
  74.            PUSH    DS                  ;PUSH RETURN SEG ADDR ON STACK
  75.            SUB     AX,AX               ;PUSH RETURN OFFSET OF ZERO
  76.            PUSH    AX                  ;ON STACK
  77.            MOV     AX,SEG DATA         ;SET ES-REGISTER TO POINT
  78.            MOV     ES,AX               ;TO DATA SEGMENT
  79. ;
  80. ; set up screen
  81.        MOV  AH,0            ;set video mode
  82.        mov  al,3            ;color text mode
  83.        INT  10H             ;clear screen
  84.  
  85.        call    clear               ;clear screen
  86.        mov     dh,20               ;place cursor at row 18
  87.        mov     dl,0                ;                colm 0
  88.        mov     ah,2                ;   sub call for int 10h
  89.        int     10h                 ;Bios interrupt for cursor motion
  90.  ;
  91.        lea     di,LINE             ; print copyright w/box, line
  92.        mov     cx,70               ;                      by line.
  93.        call    putstrng            ;
  94.        call    newline             ;
  95.        lea     di,SIDE             ;
  96.        mov     cx,70               ;
  97.        call    putstrng            ;
  98.        call    newline             ;
  99.        lea     di,CPY_RT           ;
  100.        mov     cx,70               ;
  101.        call    putstrng            ;
  102.        call    newline             ;
  103.        lea     di,B_LINE           ;
  104.        mov     cx,70               ;
  105.        call    putstrng            ;
  106.        call    newline             ;END BOX
  107. ;
  108.        mov     dh,10               ;place cursor at row 10
  109.        mov     dl,0                ;                colm 0
  110.        mov     ah,2                ;   sub call for int 10h
  111.        int     10h                 ;Bios interrupt for cursor motion
  112. ;
  113.        LEA     DI,PROMPT1          ;PROMPT FOR EXPLAINATION 1 OF 5
  114.        MOV     CX,75
  115.        CALL    PUTSTRNG
  116.        CALL    NEWLINE
  117.        LEA     DI,PROMPT2          ;PROMPT FOR EXPLAINATION 2 OF 5
  118.        MOV     CX,75
  119.        CALL    PUTSTRNG
  120.        CALL    NEWLINE
  121.        LEA     DI,PROMPT3          ;PROMPT FOR EXPLAINATION 3 OF 5
  122.        MOV     CX,75
  123.        CALL    PUTSTRNG
  124.        CALL    NEWLINE
  125.        LEA     DI,PROMPT4          ;PROMPT FOR EXPLAINATION 4 OF 5
  126.        MOV     CX,75
  127.        CALL    PUTSTRNG
  128.        CALL    NEWLINE
  129.        LEA     DI,PROMPT5          ;PROMPT FOR EXPLAINATION 5 OF 5
  130.        MOV     CX,75
  131.        CALL    PUTSTRNG
  132.        CALL    NEWLINE
  133. ;
  134.        mov     dh,4                ;place cursor at row 4
  135.        mov     dl,0                ;                colm 0
  136.        mov     ah,2                ;   sub call for int 10h
  137.        int     10h                 ;Bios interrupt for cursor motion
  138.        lea     di,heading          ; print heading
  139.        mov     cx,75
  140.        call    putstrng
  141.        call    newline
  142.        CALL    FRAME               ;DRAW FRAME
  143.  
  144.  
  145.  
  146. IN_KEY:
  147.  
  148.     MOV     AH,2            ;GET KEYBOARDS FLAG BYTES
  149.     INT     16H             ;BIOS KEYBOARD CALL
  150.     XOR     AH,AH           ;ZERO AH
  151.         MOV     FLAG,AX         ;SAVE FLAGS WITH ZEROS IN HIGH BYTE
  152.     CMP     AX,FLAG1        ;SAME FLAG AS BEFORE?
  153.     JNE     N_FLAG          ;DIFFERENT FLAG, GO SHOW IT!
  154.  
  155.     MOV     AH,1            ;IS THERE A BYTE IN KEYBOARD BUFFER?
  156.     INT     16H             ;BIOS KEYBOARD CALL
  157.     JNZ     CODE_DISPLAY    ;ZF=0, BYTE WAITING, GO GET IT!
  158.  
  159.     JMP     SHORT IN_KEY    ;TAKE IT FROM THE TOP
  160.  
  161. N_FLAG:
  162.     MOV     FLAG1,AX        ;Save the new flag for the next cycle
  163.     CALL    CLEARLINE       ;SETUP FOR NEW DISPLAY
  164.     CALL    NEWFLAG        ;SHOW FLAG ROUTINE
  165.  
  166.     JMP     SHORT IN_KEY    ;DONE. TAKE IT FROM THE TOP
  167.  
  168. CODE_DISPLAY:
  169.     CALL    CLEARLINE
  170.     CALL    NEWFLAG
  171.  
  172.     MOV     AH,0            ;READ KEYBOARD BUFFER
  173.     INT     16H             ;BIOS KEYBOARD CALL
  174.     MOV     TEMP,AX         ;HOLD RESULTS FOR A SECOND
  175.     XOR     AH,AH           ;ZERO HIGH BYTE TO JUST GET ASCII CODE
  176.     MOV     ASCII,AL        ;SAVE ASCII CODE
  177.  
  178.     MOV    AX,TEMP         ;GET RESULTS
  179.  
  180.     XCHG    AH,AL           ;PLACE SCAN CODE INTO LOW BYTE
  181.     XOR     AH,AH           ;ZERO HIGH BYTE
  182.     MOV     SCAN,AX         ;SAVE SCAN CODE
  183.  
  184.     CMP     AX,SCAN1        ;SAME KEY AS LAST TIME?
  185.     JE      STOP1           ;YES IT WAS, EXIT PROGRAM
  186.  
  187.     JMP     SHORT POTS1     ;YOUR BASIC SKIP CODE BLOCK
  188. STOP1:
  189.     JMP     LAST            ;  LONG JMP
  190. POTS1:
  191.  
  192.     MOV     SCAN1,AX        ;PLACE SCAN INTO SCAN1 FOR NEXT CYCLE
  193.  
  194.     MOV     DH,5            ;PLACE CURSOR AT ROW 5
  195.     MOV     DL,50           ;               COLM 50
  196.     MOV     BH,0
  197.     MOV     AH,2            ;PLACE CURSOR SUB FUNCTION
  198.     INT     10H             ;BIOS SCREEN INTERRUPT
  199.  
  200.     LEA     DI,ASCII        ;GET CHAR
  201.     MOV     CX,1            ;ONE CHAR
  202.     CALL    PUTSTRNG        ;DISPLAY CHAR
  203.  
  204.     MOV     DH,5            ;    ROW 5
  205.     MOV     DL,56           ;   COLM 56
  206.     MOV     BH,0
  207.     MOV     AH,2            ;PLACE CURSOR SUB FUNCTION
  208.     INT     10H             ;BIOS SCREEN INTERRUPT
  209.     MOV     AX,SCAN         ;GET SCAN CODE
  210.     MOV     BX,0            ;RIGHT JUSTIFY DEC #
  211.     CALL    PUTDEC          ;DISPLAY SCAN CODE AS NUMBER
  212.  
  213.     dec    count        ; count=count-1
  214.     mov    ax,count
  215.     cmp    ax,0
  216.     jz    last
  217.  
  218.     MOV     Al,ASCII        ;GET CHAR
  219.     CMP     Al,0            ;CHECK FOR ZERO
  220.     JZ      NON_PRT         ;PRINT NON_PRINTABLE COLM
  221.  
  222.     JMP     IN_KEY          ;DONE.  TAKE IT FROM THE TOP
  223.  
  224. NON_PRT:
  225.     CALL    NONPRT
  226.     JMP     IN_KEY
  227.  
  228. ;
  229. LAST:
  230.        mov     dh,24               ;place cursor at row 24
  231.        mov     dl,0                ;                colm 0
  232.        mov     bh,0
  233.        mov     ah,2                ;    sub call for int 10h
  234.        int     10h                 ;Bios interrupt for cursor motion
  235.        RET                         ;RETURN
  236. KEYCODES   ENDP
  237.  
  238.  
  239. ;
  240.  
  241. CLEARLINE    PROC    NEAR
  242.     mov     dh,5            ;  row 5
  243.     mov     dl,1            ; colm 1
  244.     mov     bh,0
  245.     mov     ah,2            ;place cusor sub func
  246.     int     10